package leetcode.set_map;

import java.util.HashMap;
import java.util.Map;

/**
 * 205. 同构字符串
 * <p>
 * 给定两个字符串 s 和 t，判断它们是否是同构的。
 * <p>
 * 如果 s 中的字符可以被替换得到 t ，那么这两个字符串是同构的。
 * <p>
 * 所有出现的字符都必须用另一个字符替换，同时保留字符的顺序。两个字符不能映射到同一个字符上，但字符可以映射自己本身。
 * <p>
 * 示例 1:
 * <p>
 * 输入: s = "egg", t = "add"
 * 输出: true
 * <p>
 * 示例 2:
 * <p>
 * 输入: s = "foo", t = "bar"
 * 输出: false
 * <p>
 * 示例 3:
 * <p>
 * 输入: s = "paper", t = "title"
 * 输出: true
 * <p>
 * 分析： 映射关系
 * s   -- t 是可以映射，反过来  t---s 也可以进行映射
 * e  <-> a
 * g  <-> d
 * 定义一个map  同时遍历s t， 进行判断 map.get(key-s[i]) 是否存在  不存在的时候，要进行反向验证  a->g的情况  是否包含value =t[i]
 * 不包含时进行添加 map.put(s[i],t[i])
 * 如果包含key  需要验证v == s[i]达到 g->a的验证
 */
public class Solution205 {
    public static boolean isIsomorphic(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        Map<Character, Character> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char siKey = s.charAt(i);
            char tiValue = t.charAt(i);
            if (!map.containsKey(siKey)) {  //k-v映射关系判断，是添加还是判断
                if (map.containsValue(tiValue)) return false;  // v->k 的映射关系
                map.put(siKey, tiValue);
            } else {
                if (!map.get(siKey).equals(tiValue)) {
                    return false;
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {
        String s = "paper", t = "title";
        System.out.println(isIsomorphic(s, t));
    }
}
